package com.wlc.collection.myhashmap;

import com.wlc.util.RandomStrUtil;

import java.util.*;

/**
 * @author 王立朝 wanglichao@champion-credit.com
 * @description 自定义HashMap
 * 设计一个MyHashMap，实现接口IHashMap
 * <p>
 * MyHashMap内部由一个长度是2000的对象数组实现。
 * <p>
 * 设计put(String key,Object value)方法
 * 首先通过上一个自定义字符串的hashcode练习获取到该字符串的hashcode,
 * 然后把这个hashcode作为下标，定位到数组的指定位置。
 * 如果该位置没有数据，则把字符串和对象组合成键值对Entry，再创建一个LinkedList，
 * 把键值对，放进LinkedList中，最后把LinkedList 保存在这个位置。
 * 如果该位置有数据，一定是一个LinkedList,则把字符串和对象组合成键值对Entry，插入到LinkedList后面。
 * <p>
 * 设计 Object get(String key) 方法
 * 首先通过上一个自定义字符串的hashcode练习获取到该字符串的hashcode,然后把这个hashcode作为下标，定位到数组的指定位置。
 * 如果这个位置没有数据，则返回空
 * 如果这个位置有数据，则挨个比较其中键值对的键-字符串，是否equals，找到匹配的，把键值对的值，返回出去。找不到匹配的，就返回空
 * @date 2021-07-13 11:47
 */
public class MyHashMap implements IHashMap {
    LinkedList<Entry>[] linkedList = new LinkedList[2000];

    @Override
    public void put(String key, Object object) {
        // 拿到hashCode
        int hashCode = RandomStrUtil.getHashCode(key);
        // 找到对应的LinkedList
        LinkedList<Entry> entries = linkedList[hashCode];
        // 如果entries 为空， 则创建一个LinkedList
        if (null == entries) {
            entries = new LinkedList<>();
            linkedList[hashCode] = entries;
        }
        // 判断 entries 是否已经有了键值对，
        boolean found = false;
        for (Entry entry : entries) {
            // 已经有了键值对，就把原来的值替换掉
            if (key.equals(entry.key)) {
                entry.value = object;
                found = true;
                break;
            }
        }
        // 如果没有存在的键值对，就创建一个新的键值对
        if (!found) {
            Entry entry = new Entry(key, object);
            entries.add(entry);
        }
    }

    @Override
    public Object get(String key) {
        // 根据 key值获取HashCode
        int hashCode = RandomStrUtil.getHashCode(key);
        // 根据hashCode 找到对应的链表LinkedList
        LinkedList<Entry> entries = linkedList[hashCode];
        // 没有值，返回null
        if (null == entries) {
            return null;
        }
        Object object = null;
        // 比较linkedList 的每一个key值，如果一样，就返回
        for (int i = 0; i < entries.size(); i++) {
            if (key.equals(entries.get(i).key)) {
                object = entries.get(i).value;
                break;

            }
        }
        return object;
    }


    public static void main(String[] args) {
        MyHashMap myHashMap = new MyHashMap();
        myHashMap.put("a", "hello world!");
        System.out.println(myHashMap.get("a"));
    }
}